package com.heihu577.util;

import com.heihu577.bean.MarkdownFile;

import java.io.*;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileUtils {
    private static String CONFIG_DIRECTORY = "config"; // 配置文件存放目录

    /**
     * 用来读取当前路径下的文件夹, 提供程序内部使用
     *
     * @return
     */
    private static File configDir() {
        String nowPath = System.getProperty("user.dir"); // 获取当前项目所在目录, 用来保存 OSS 存储位置
        File file = new File(nowPath + File.separator + CONFIG_DIRECTORY);
        if (!file.exists()) {
            file.mkdir();
        }
        if (file.isDirectory()) {
            return file;
        } else {
            // 非正常情况
            return null;
        }
    }

    /**
     * 通过文件名称获取 properties & FileInputStream & FileOutputStream, 没有就创建, 这里无需加后缀名, 会自动拼接上后缀
     *
     * @return
     * @throws Exception
     */
    public static Map<String, Object> getPropertiesFileInputStreamFileOutputStream(String filename) throws Exception {
        File file = configDir();
        HashMap<String, Object> result = new HashMap<>();
        if (file != null) {
            file = new File(file, filename + ".properties");
            if (!file.exists()) {
                file.createNewFile(); // 创建一个新的
            }
            // 文件存在, 解析为 Properties
            Properties properties = new Properties();
            FileInputStream fileInputStream = new FileInputStream(file);
            properties.load(fileInputStream);
            result.put("properties", properties);
            result.put("file", file);
            result.put("fileInputStream", fileInputStream);
            // 不能放置 FileOutputStream, 否则文件将清空
        }
        return result;
    }

    /**
     * 模糊查询, 查询具体后缀文件
     *
     * @return
     */
    public static File findFileByLike(File parentPath, String endsWith) {
        String[] list = parentPath.list();
        for (String s : list) {
            if (s.endsWith(endsWith.toUpperCase()) || s.endsWith(endsWith.toLowerCase())) {
                return new File(parentPath, s);
            }
        }
        return null;
    }

    /**
     * 通过 Markdown 文件, 解析出文件内容, 以及图片内容, 提供给后续准备上传
     */
    public static MarkdownFile parseMdImages(File file) {
        MarkdownFile markdownFile = new MarkdownFile();
        try {
            // LinkedHashMap<String, String> urls = new LinkedHashMap<>();
            // 设置 File 存放的位置
            Vector<String> urls = new Vector<>();
            markdownFile.setFile(file);
            // 读取 MD 文件内容, 并使用 UTF-8 编码
            String content = new String(Files.readAllBytes(Paths.get(file.getAbsolutePath())), StandardCharsets.UTF_8);
            markdownFile.setContent(content);
            // 使用正则表达式处理 Markdown 文件
            Pattern compile = Pattern.compile(MarkdownFile.IMAGE_PATTERN, Pattern.MULTILINE); // 准备正则表达式, 允许多行匹配
            // 开始匹配
            Matcher matcher = compile.matcher(content); // 开始匹配
            while (matcher.find()) { // 开始查找
                // 使用 URL 进行解码, 否则可能会爆出文件不存在的错误
                urls.add(URLDecoder.decode(matcher.group(2), StandardCharsets.UTF_8.toString()));
            }
            // 设置到对象中
            markdownFile.setUrls(urls);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return markdownFile;
    }


}
